/**
 * @description 格式化时间
 * @param {String|Number} dateTime 需要格式化的时间戳
 * @param {String} fmt 格式化规则 yyyy:mm:dd|yyyy:mm|yyyy年mm月dd日|yyyy年mm月dd日 hh时MM分等,可自定义组合 默认yyyy-mm-dd
 * @returns {string} 返回格式化后的字符串
 */
export function timeFormat(dateTime = null, formatStr = 'yyyy-mm-dd') {
	let date
	// 若传入时间为假值，则取当前时间
	if (!dateTime) {
		date = new Date()
	}
	// 若为unix秒时间戳，则转为毫秒时间戳（逻辑有点奇怪，但不敢改，以保证历史兼容）
	else if (/^\d{10}$/.test(dateTime?.toString().trim())) {
		date = new Date(dateTime * 1000)
	}
	// 若用户传入字符串格式时间戳，new Date无法解析，需做兼容
	else if (typeof dateTime === 'string' && /^\d+$/.test(dateTime.trim())) {
		date = new Date(Number(dateTime))
	}
	// 其他都认为符合 RFC 2822 规范
	else {
		// 处理平台性差异，在Safari/Webkit中，new Date仅支持/作为分割符的字符串时间
		date = new Date(
		  typeof dateTime === 'string' ? dateTime.replace(/-/g, '/') : dateTime
		)
	}

	const timeSource = {
		'y': date.getFullYear().toString(), // 年
		'm': (date.getMonth() + 1).toString().padStart(2, '0'), // 月
		'd': date.getDate().toString().padStart(2, '0'), // 日
		'h': date.getHours().toString().padStart(2, '0'), // 时
		'M': date.getMinutes().toString().padStart(2, '0'), // 分
		's': date.getSeconds().toString().padStart(2, '0') // 秒
		// 有其他格式化字符需求可以继续添加，必须转化成字符串
	}

	for (const key in timeSource) {
		const [ret] = new RegExp(`${key}+`).exec(formatStr) || []
		if (ret) {
		  // 年可能只需展示两位
		  const beginIndex = key === 'y' && ret.length === 2 ? 2 : 0
		  formatStr = formatStr.replace(ret, timeSource[key].slice(beginIndex))
		}
	}

	return formatStr
}

/** 页面跳转 */
export function route(url,type='to',delta=1) {
	if (!url) {
		uni.showToast({ title:'开发中...',icon:'none' })
		return
	}
	if (type == 'navigateTo' || type == 'to') {
	    uni.navigateTo({ url })
	}
	if (type == 'redirectTo' || type == 'redirect') {
	    uni.redirectTo({ url })
	}
	if (type == 'switchTab' || type == 'tab') {
	    uni.switchTab({ url })
	}
	if (type == 'reLaunch' || type == 'launch') {
	    uni.reLaunch({ url })
	}
	if (type == 'navigateBack' || type == 'back') {
	    uni.navigateBack({ delta })
	}
}

// 组装图片入参id
export function getImgFileId(imgArry) {
	let file = imgArry.length ? imgArry.map(item=>{ return { 'file_id':item.file_id } }) : []
	return file
}

/**
 * @name 图片上传
 */
export function uploadFileImg(file,url=env.upload_url) {
	return new Promise((resovle,reject)=>{
		uni.uploadFile({
			url,
			filePath: file,
			name: 'file',
			header:{
				'token':uni.getStorageSync('token')
			},
			success: (uploadFileRes) => {
				resovle(uploadFileRes)
			},
			fail: err => {
				console.log(err)
				reject()
			},
			complete: () => {
				uni.hideLoading()
			}
		});
	})
}

/**
 * 验证手机格式
 */
function mobile(value) {
    return /^1[23456789]\d{9}$/.test(value)
}

/**
 * @param 表单验证
 */
export function formRules(formData,rules) {
	let status = true;
	out:  // for循环的名字
	// 循环验证对象
	for (let key in rules) {
		// 验证规则数组
		for (let i=0;i<rules[key].length;i++) {
			let { msg,type='def',reg,validator } = rules[key][i];
			let formVal = formData[key];
			
			switch (true){
				case type=='def' && !formVal:				// 默认判空
				case type=='reg' && !reg.test(formVal):		// 正则判断
				case type=='phone' && !mobile(formVal):		// 手机号验证
				case type=='email' && !email(formVal):		// 邮箱验证
					status = false
					uni.showToast({ title:msg,icon:'none' })
					break out; // 跳出循环
			}
			
			// 自定义验证
			if(type=='diy') {
				validator(
					formVal, 
					(e,diymsg) => {
						!e && uni.showToast({ title:diymsg,icon:'none' })
						status = e
					}
				)
				if (!status) break out;
			}
		}
	}
	return status
}